package Socketserver.SQL;

import java.sql.*;
import java.util.*;

public class ROOT {
    public Boolean iT_CAN_MOVE_OR_NOT=true;
    private String username ;//sql用户名
    private String password ;//sql密码

    public String getDATAABSE_NAME() {
        return DATAABSE_NAME;
    }
    /**
     * 数据库的名字
     */
    private String DATAABSE_NAME="MY_SQL_SERVER";

    /**
     * 创建个人 用户的表
     */
    //*  标签： id  name  password  账号  是不是管理员（只有root 是管理员）
    private String Table_id="id";
    private String Table_name="name";
    private String Table_password="password";
    private String Table_type="type";//账号
    private String Table_root_ ="is_root"; // 修正：匹配表结构中的is_root字段
    private String The_table_name="user_table"; // 修正：匹配表结构中的表名
    public String getThe_table_name() {
        return The_table_name;
    }
    public String getTable_password() {
        return Table_password;
    }

    public String getTable_id() {
        return Table_id;
    }

    public String getTable_name() {
        return Table_name;
    }

    public String getTable_type() {
        return Table_type;
    }

    public String getTable_root_() {
        return Table_root_;
    }
    /**
     * 创建资料查询的表
     */
    //标签 id name(文本名字) address author(是那个干的)
    private String TXT_TABLE_id="TXT_id";
    private String TXT_TABLE_name="TXT_name";
    private String TXT_TABLE_address="TXT_address";
    private String TXT_TABLE_author="TXT_author";
    private String The_TXTTable_name="txt_table"; // 修正：匹配表结构中的表名
    public String getThe_TXTTable_name() {
        return The_TXTTable_name;
    }
    public String getTXT_TABLE_address() {
        return TXT_TABLE_address;
    }

    public String getTXT_TABLE_name() {
        return TXT_TABLE_name;
    }

    public String getTXT_TABLE_id() {
        return TXT_TABLE_id;
    }

    public String getTXT_TABLE_author() {
        return TXT_TABLE_author;
    }
    //private String url="jdbc:mysql://localhost:3306/java_sql_test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    /**
     * 这是固定的
     */
    private String url="jdbc:mysql://localhost:3306?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    private String driver="com.mysql.cj.jdbc.Driver";
    /**
     * 数据表 的 字段的建立
     */
    /**
     * driver;url;
     *这些是固定的 只需要输出就可以了
     */
    public String getDriver() {
        return driver;
    }
    public String getUrl() {
        return url;
    }
    /**
     * END
     */

    /**
     *  输入 username 和password
     */
    public void setUsername(String username) {
        this.username = username;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    /**
     *  输出 username 和password
     */
    public String getUsername() {
        return username;
    }
    public String getPassword() {
        return password;
    }
    /**
     * end
     */


    /**
     * 一开始就要加载
     */
    public ROOT(){
        /**
         * 说明一下 此项目需要年接
         * url 为jdbc:mysql://localhost:3306/mysql?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
         * 的 数据库 MySQL8.0.12
         * 如果 没有对应的 软件 则需要 下载
         */
        System.out.println(
                "             * 说明一下 此项目需要接\n" +
                        "jdbc路径为 com.mysql.cj.jdbc.Driver \n" +
                        "             * url 为jdbc:mysql://localhost:3306?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC\n" +
                        "             * 的 数据库 MySQL8.0.12\n" +
                        "             * 密码和用户名需要自己输入\n"+
                        "             * 如果 没有对应的 软件 则需要 下载");
        //输入对应的用户名 和密码
        if(true){
            //开发者模式
            setUsername("root");
            setPassword("root");
            return ;
        }

        System.out.println("输入用户名");
        setUsername(new Scanner(System.in).nextLine());
        System.out.println("输入密码");
        setPassword(new Scanner(System.in).nextLine());
    }

    /**
     * 链接试探
     */
    public void ROOT_TEST(){

        //只是试探性的创立链接 如果链接不上 后续任务 一律不执行
        try{
            Class.forName( getDriver() );
            //Class.forName("com.mysql.cj.jdbc.Driver");
            try{
                //把他们一一输入到链接中
                Connection connction= DriverManager.getConnection(
                        getUrl(),
                        getUsername(),
                        getPassword()
                );
            }catch(Exception e){
                iT_CAN_MOVE_OR_NOT=false;//彻底执行不了
                System.out.println(
                        "输入的密码 或 用户名 或 jdbc用不了"
                );
                System.out.println(e.getMessage());
            }
        }catch(Exception e){
            iT_CAN_MOVE_OR_NOT=false;//彻底执行不了
            System.out.println("请链接数据库");
            System.out.println(e.getMessage());
        }

        if(iT_CAN_MOVE_OR_NOT==true){
            System.out.println("链接sql 无异常");
        }else{
            System.out.println("链接 失败");
        }

    }


    /**
     * 创建数据表 或 删除数据表的模板
     */
    private boolean root_USE_SQL_ForOnly_ADD_DELETE_CHANGE(String sql) {
        //1.访问
        try{
            Class.forName(getDriver());
        }catch(Exception e){
            System.out.println(e.getMessage());
            return false;
        }
        /**
         * 访问成功
         * 然后
         */
        Connection connection=null;//1创建 链接
        Statement statement=null; //3Statement的创建
        PreparedStatement ps =null;//4添加数据预处理
        //开始 执行sql sql语句
        boolean watcher=true;
        try{
            connection=DriverManager.getConnection(
                    getUrl(),
                    getUsername(),
                    getPassword()
            );
            // 创建SQL语句 的链接
            statement=connection.createStatement();
            try{
                ps =connection.prepareStatement(sql);
                ps.executeLargeUpdate();//executeUpdate(); // 关键执行步骤
            }catch(Exception e){
                System.out.println(e.getMessage());
                watcher=false;
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
            watcher=false;
        }finally {
            try{
                //用完关闭；
                if (ps != null) {
                    ps.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            }catch(Exception e){
                System.out.println(e.getMessage());
            }

        }
        return watcher;
    }

    /**
     * 创建数据表
     *
     * @return
     */
    public boolean root_USE_SQL_ForOnly_CREATEDATABASE() {
        try{
            if(
                    root_USE_SQL_ForOnly_ADD_DELETE_CHANGE(
                            "CREATE DATABASE IF NOT EXISTS MY_SQL_SERVER"
                    )
            ){
                System.out.println("创建成功");
            }else{
                System.out.println("创建失败");
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        return false;
    }

    /**
     * 删除数据表
     */
    public void root_USE_SQL_ForOnly_DROPDATABASE() {
        try{
            if(
                    root_USE_SQL_ForOnly_ADD_DELETE_CHANGE(
                            "DROP DATABASE IF EXISTS MY_SQL_SERVER"
                    )
            ){
                System.out.println("删除成功");
            }else{
                System.out.println("删除失败");
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }

    /**
     * database:MY_SQL_SERVER
     * 接下来要制作表 如果没有 就再次创造一个
     * 然后是 删除 就此而已
     *
     * 为什么 因为管理员的权限最大 root 赛高
     *          *  //个人的表 root
     *          *  标签： id  name  password  账号  是不是管理员（只有root 是管理员）
     *          *  //资料查询的表
     *          * 标签 id name(文本名字) address autor(是那个干的)
     *          *
     */
    //sql执行语句的模板
    /**
     * 创建数据表 或 删除数据表的模板
     */
    private boolean root_USE_SQL_ForOnly_TABLE(String sql) {
        //1.访问
        try{
            Class.forName(getDriver());
        }catch(Exception e){
            System.out.println(e.getMessage());
            return false;
        }
        /**
         * 访问成功
         * 然后
         */
        Connection connection=null;//1创建 链接
        Statement statement=null; //3Statement的创建
        PreparedStatement ps =null;//4添加数据预处理
        //开始 执行sql sql语句
        boolean watcher=true;
        try{
            connection=DriverManager.getConnection(
                    getUrl(),
                    getUsername(),
                    getPassword()
            );
            // 创建SQL语句 的链接
            statement=connection.createStatement();
            try{
                ps =connection.prepareStatement("USE MY_SQL_SERVER");
                ps.executeLargeUpdate();

                ps =connection.prepareStatement(sql);
                ps.executeLargeUpdate();//executeUpdate(); // 关键执行步骤
            }catch(Exception e){
                System.out.println(e.getMessage());
                watcher=false;
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
            watcher=false;
        }finally {
            try{
                //用完关闭；
                if (ps != null) {
                    ps.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            }catch(Exception e){
                System.out.println(e.getMessage());
            }

        }
        return watcher;
    }

    /**
     * 创建数据表
     */
    public void root_create_SQL_table(){
        //*  标签： id  name  password  账号  是不是管理员（只有root 是管理员）
        String sql="CREATE TABLE IF NOT EXISTS "+getThe_table_name()+"(" +
                "   "+getTable_id()+" varchar(255) primary key," +
                "   "+getTable_name()+" varchar(255) NOT NULL," +
                "   "+getTable_password()+" varchar(255) NOT NULL," +
                "   "+getTable_type()+" varchar(255) NOT NULL," +
                "   "+getTable_root_()+" int NOT NULL" +
                ")";
        if(root_USE_SQL_ForOnly_TABLE(sql)){
            System.out.println(getThe_table_name()+"创建成功");
        }
    }
    /**
     * 删除数据表
     */
    public void root_drop_SQL_table(){
        //删除
        String sql="DROP TABLE IF EXISTS "+getThe_table_name();
        if(root_USE_SQL_ForOnly_TABLE(sql)){
            System.out.println(getThe_table_name()+"删除成功");
        }
    }
    /**
     * 创建数据表TXT
     */
    public void root_create_SQLTXT_table(){
        //标签 id name(文本名字) address autor(是那个干的)
        String sql="CREATE TABLE IF NOT EXISTS "+getThe_TXTTable_name()+"(" +
                "   "+getTXT_TABLE_id()+" varchar(255) primary key," +
                "   "+getTXT_TABLE_name()+" varchar(255) NOT NULL," +
                "   "+getTXT_TABLE_address()+" varchar(255) NOT NULL," +
                "   "+getTXT_TABLE_author()+" varchar(255) NOT NULL" +
                ")";
        if(root_USE_SQL_ForOnly_TABLE(sql)){
            System.out.println(getThe_TXTTable_name()+"创建成功");
        }
    }
    /**
     * 删除数据表TXT
     */
    public void root_drop_SQLTXT_table(){
        //标签 id name(文本名字) address autor(是那个干的)
        String sql="DROP TABLE IF EXISTS "+getThe_TXTTable_name();
        if(root_USE_SQL_ForOnly_TABLE(sql)){
            System.out.println(getThe_TXTTable_name()+"删除成功");
        }
    }

    //之后管理员 要做的事情是
    /**
     * 删除 不合规的 用户
     * 删除 不合理的 表
     *      涉及到的查询 1.名字 2.id[id 要单独打出来]
     */
    /**
     * 查找表的模板（保留原方法名和参数）
     * @param sql 查询SQL语句
     * @param HOW 需要打印的字段名（兼容原有打印逻辑）
     * @return 查询结果集（新增返回值，供root/服务端使用）
     */
    public List<Map<String, String>> root_FIND_SQL_ForOnly_TABLE(String sql, String HOW) {
        // 新增：用于存储查询结果的集合（键：字段名，值：字段值）
        List<Map<String, String>> resultList = new ArrayList<>();

        // 1. 声明资源（合并冗余定义）
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            // 2. 加载驱动（保留原有逻辑）
            Class.forName(getDriver());

            // 3. 获取连接并执行查询（精简嵌套结构）
            connection = DriverManager.getConnection(getUrl(), getUsername(), getPassword());
            ps = connection.prepareStatement("USE MY_SQL_SERVER");
            ps.executeLargeUpdate();
            ps = connection.prepareStatement(sql);
            rs = ps.executeQuery();

            // 4. 处理结果集（同时实现“打印指定字段”和“返回完整结果”）
            if (rs != null) {
                ResultSetMetaData metaData = rs.getMetaData();
                int columnCount = metaData.getColumnCount(); // 获取所有字段数量
                boolean hasData = false;

                while (rs.next()) {
                    hasData = true;
                    Map<String, String> rowData = new HashMap<>();

                    // 4.1 遍历所有字段，存入Map（用于返回完整结果）
                    for (int i = 1; i <= columnCount; i++) {
                        String columnName = metaData.getColumnName(i);
                        String columnValue = rs.getString(i);
                        rowData.put(columnName, columnValue);
                    }
                    resultList.add(rowData);

                    // 4.2 兼容原有逻辑：打印HOW指定的字段
                    //System.out.println(rs.getString(HOW));
                }

                if (!hasData) {
                    System.out.println("查询结果集为空");
                } else {
                    System.out.println(); // 换行分隔
                }
            } else {
                System.out.println("查询结果集为空");
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
            resultList.clear(); // 异常时清空结果
        } finally {
            // 新增：抽取资源关闭逻辑，精简代码
            closeResources(connection, ps, rs);
        }

        // 新增：返回查询结果集（供root/服务端调用）
        return resultList;
    }

    // 【新增辅助方法：统一关闭资源，减少冗余】
    private void closeResources(Connection conn, PreparedStatement ps, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (ps != null) ps.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            System.out.println("资源关闭异常：" + e.getMessage());
        }
    }


    /**
     * 删除 不合规的 用户  涉及到的查询 1.名字 2.id[id 要单独打出来]
     */
    public void root_drop_SQL_table_FORUser(String value,String way){
        //标签 id  name  password  账号  是不是管理员（只有root 是管理员）
//        System.out.println(
//                root_FIND_SQL_ForOnly_TABLE("SELECT * FROM user_table WHERE password like '%d%' ;","password")
//        );;
        if(way==null|| way.isEmpty()){
            root_USE_SQL_ForOnly_TABLE("DELETE FROM " + getThe_table_name());
            return;
        }
        if(way.equals("id")){
            root_USE_SQL_ForOnly_TABLE("DELETE FROM " + getThe_table_name() + " WHERE " +way+ " like '"+value+"'");
        }else{
            root_USE_SQL_ForOnly_TABLE("DELETE FROM " + getThe_table_name() + " WHERE " +way+ " like '%"+value+"%'");
        }

    }
    /**
     * 删除 不合规的 TXT  涉及到的查询 1.名字 2.id[id 要单独打出来]
     *
     * (其中还包括删除 文件 但是我觉得这是刷新该高的事情)
     */
    public void root_drop_SQL_table_FORTxt(String value,String way){
        //标签 id name(文本名字) address autor(是那个干的)
        if(way==null|| way.isEmpty()){
            root_USE_SQL_ForOnly_TABLE("DELETE FROM " + getThe_TXTTable_name());
            return;
        }
        if(way.equals("TXT_id")){
            root_USE_SQL_ForOnly_TABLE("DELETE FROM " + getThe_TXTTable_name() + " WHERE " +way+ " like '"+value+"'");
        }else{
            root_USE_SQL_ForOnly_TABLE("DELETE FROM " + getThe_TXTTable_name() + " WHERE " +way+ " like '%"+value+"%'");
        }

    }
    /**
     * 查找对应的东西 多表查询（返回全部查询信息）
     * @param what_Table_name 表名
     * @param HOW 用于打印的字段名（兼容原有逻辑）
     * @param value 查询值
     * @return 完整查询结果（每行数据为Map，键：字段名，值：字段值）
     */
    public List<Map<String, String>> SELECT_TABLE_FOR_ALL_Table_rootss(String what_Table_name, String HOW, String value) {
        // 声明用于存储查询结果的变量
        List<Map<String, String>> queryResult;

        if (value == null || value.isEmpty()) {
            // 无查询值时，查询全表
            queryResult = root_FIND_SQL_ForOnly_TABLE(
                    "SELECT * FROM " + what_Table_name,
                    HOW
            );
            return queryResult;
        }

        // 有查询值时，根据表名和字段构建条件查询
        if (getThe_TXTTable_name().equals(what_Table_name)) {
            if (HOW.equals("TXT_id")) {
                // TXT表的id精确查询
                queryResult = root_FIND_SQL_ForOnly_TABLE(
                        "SELECT * FROM " + what_Table_name + " WHERE " + HOW + " like '" + value + "' ",
                        HOW
                );
            } else {
                // TXT表的其他字段模糊查询
                queryResult = root_FIND_SQL_ForOnly_TABLE(
                        "SELECT * FROM " + what_Table_name + " WHERE " + HOW + " like '%" + value + "%' ",
                        HOW
                );
            }
        } else {
            if (HOW.equals("id")) {
                // 用户表的id精确查询
                queryResult = root_FIND_SQL_ForOnly_TABLE(
                        "SELECT * FROM " + what_Table_name + " WHERE " + HOW + " like '" + value + "' ",
                        HOW
                );
            } else {
                // 用户表的其他字段模糊查询
                queryResult = root_FIND_SQL_ForOnly_TABLE(
                        "SELECT * FROM " + what_Table_name + " WHERE " + HOW + " like '%" + value + "%' ",
                        HOW
                );
            }
        }



        // 返回完整查询结果（供root客户端使用）
        return queryResult;
    }
}